<?php
/**
 * Created by PhpStorm.
 * User: yuexch
 * Date: 2019/7/2
 * Time: 10:36 AM
 */

class push
{
    //安卓自定义语音路径
    private $androidSoundUrl = [];
    //ios自定义语音路径
    private  $iosSoundUrl = [];

    private $JPUSH_USER_APP_KEY = null;
    private $JPUSH_USER_MASTER_SECRET = null;
    private $JPUSH_AGENT_APP_KEY = null;
    private $JPUSH_AGENT_MASTER_SECRET = null;
    //需要推送的系统
    private $pushSystemArr = [
        '0' => ['ios', 'android'],
        '1' => ['android'],
        '2' => ['ios']
    ];

    public function __construct($JPushData = [])
    {
        // 加载公共文件
        if (is_file( 'common.php')) {
            include_once 'common.php';
        }
        //查看是否开启推送
        var_dump($JPushData);
        $JPushData ?:$JPushData = [
            'JPUSH_USER_APP_KEY'=>'<填写从极光获取的APP_KEY>',
            'JPUSH_USER_MASTER_SECRET'=>'<填写从极光获取的MASTER_SECRET>'
        ];
        isset($JPushData['JPUSH_USER_APP_KEY']) ? $this->JPUSH_USER_APP_KEY = $JPushData['JPUSH_USER_APP_KEY'] : '';
        isset($JPushData['JPUSH_USER_MASTER_SECRET']) ? $this->JPUSH_USER_MASTER_SECRET = $JPushData['JPUSH_USER_MASTER_SECRET'] : '';
    }

    /**
     * 推送给所有人
     * @param string $title 推送标题
     * @param string $content 推送内容
     * @param array $extrasArr 推送额外参数
     * @param string $system 推送系统0全部1安卓2ios
     * @return array array->status1成功 array->status0失败
     */
    public function sendAll($title='title',$content='content',$extrasArr=['status'=>0],$system='0') {
        $APP_KEY = $this->JPUSH_USER_APP_KEY;
        $MASTER_SECRET = $this->JPUSH_USER_MASTER_SECRET;
        $client = new \JPush\Client($APP_KEY,$MASTER_SECRET);
        $pusher = $client->push();
        //设置发送平台
        $pusher->setPlatform($this->pushSystemArr[$system]);
        //设置发送对象，发送给所有人
        $pusher->addAllAudience();
        //设置发送内容
        $pusher->setNotificationAlert($title);
        //设置给ios平台推送的数据
        $pusher->iosNotification($content, array(
            'sound' => 'sound.caf',
            'badge' => '1',
            'content-available' => true,
            'mutable-content' => true,
            //推送的数据
            'extras' => $extrasArr,
        ));
        //设置android平台推送
        $pusher->androidNotification($content, array(
            'title' => $title,
            // 'build_id' => 2,
            'extras' => $extrasArr,
        ));
        $pusher->message($content, array(
            'title' => $title,
            // 'content_type' => 'text',
            'extras' => $extrasArr,
        ));
        $pusher->options(array(
            //设置推送环境True 表示推送生产环境，False 表示要推送开发环境；
            'apns_production' => true,
        ));
        try {
            //执行推送
            $pusher->send();
            $ret = ['status'=>1,'msg'=>'已推送'];

        } catch (\JPush\Exceptions\JPushException $e) {
            $ret = ['status'=>0,'msg'=>$e];
        }
        return $ret;
    }

    /**
     * 进行推送(根据设备id)
     * @param string/array $cid 设备标识。一次推送最多1000个。超过了需要注意会分多次推送
     * @param string $title 推送标题 **安卓上如果指定了，则通知里原来展示 App名称的地方，将展示成这个字段
     * @param string $content 推送内容 **内容可以为空字符串，则表示不展示到通知栏。
     * @param array $extrasArr 推送额外参数
     * @param string $system 推送系统0全部1安卓2ios
     * @param int $isdebug 设置推送环境True 表示推送生产环境，False 表示要推送开发环境；
     * @param string $alias 推送别名
     * @param array $tagArr 标签
     * @return array array->status1成功 array->status0失败
     */
    public function pushToUser($cid='',$title='',$content='',$extrasArr=['status'=>0],$system='0',$isdebug=1,$alias='',$tagArr=[]){
        $client = new \JPush\Client($this->JPUSH_USER_APP_KEY,$this->JPUSH_USER_MASTER_SECRET);
        if (!$cid){
            return ['status'=>0,'参数错误cid'];
        }
        $cidArr = is_array($cid) ? $cid : _stringToArr($cid);
        if (count($cidArr)>1000){
            //若是大于1000,进行切割推送
            $newArr = array_slice($cidArr,1000);
            $this->pushToUser($newArr,$title,$content,$extrasArr,$system,$isdebug,$alias,$tagArr);
            $cidArr = array_slice($cidArr,0,1000);
        }
        //安卓自定义语音
        $messageArr = [];
        $messageArr['title'] = $title;
        $messageArr['extras'] = $extrasArr;
        //ios自定义语音 默认：sound.caf
        $iosNotificationArr = [];
        $iosNotificationArr['sound'] = 'sound.caf';
        $iosNotificationArr['badge'] = '1';
        $iosNotificationArr['content-available'] = true;
        $iosNotificationArr['mutable-content'] = true;
        $iosNotificationArr['extras'] = $extrasArr;
        //自定义语音进行判断
        $response = $client->push()
            //设置发送的平台
            ->setPlatform($this->pushSystemArr[$system])
            ->addRegistrationId($cidArr);
        if ($alias){
            $response->addalias($alias);
        }
        if ($tagArr){
            $response->addTag($tagArr);
        }
        $content1 = [];
        $content1['body'] = $content;
        $content1['title'] = $title;
        //设置给ios平台推送的数据
        $isdebug = $isdebug ? true : false;
        $response->iosNotification($content1, $iosNotificationArr)
            //设置android平台推送
            ->androidNotification($content, array(
                'title' => $title,
                // 'build_id' => 2,
                'extras' => $extrasArr,
            ))
            ->message($content,$messageArr)
            ->options(array(
                //设置推送环境True 表示推送生产环境，False 表示要推送开发环境；
                'apns_production' => $isdebug,
            ));
        try {
            //执行推送
            $response->send();
            $ret = ['status'=>1,'msg'=>'已推送'];
        } catch (\JPush\Exceptions\JPushException $e) {
            $ret = ['status'=>0,'msg'=>$e];
        }
        return $ret;
    }

    /**
     * 对用户做透传
     * @param string/array $cid 设备标识。一次推送最多1000个。超过了需要注意会分多次推送
     * @param string $title 透传标题 **透传不会展示到通知栏。（需要前端自行监听）
     * @param string $content 透传内容 **透传不会展示到通知栏。（需要前端自行监听）
     * @param array $extrasArr 透传额外参数
     * @param string $system 透传系统0全部1安卓2ios
     * @param int $isdebug 设置推送环境True 表示推送生产环境，False 表示要推送开发环境；
     * @param string $alias 推送别名
     * @param array $tagArr 标签
     * @return array array->status1成功 array->status0失败
     */
    public function sendMessage($cid='',$title='',$content='',$extrasArr=['status'=>0],$system='0',$isdebug=1,$alias='',$tagArr=[]){
        $client = new \JPush\Client($this->JPUSH_USER_APP_KEY,$this->JPUSH_USER_MASTER_SECRET);
        if (!$cid){
            return ['status'=>0,'参数错误cid'];
        }
        $cidArr = is_array($cid) ? $cid : _stringToArr($cid);
        if (count($cidArr)>1000){
            //若是大于1000,进行切割推送
            $newArr = array_slice($cidArr,1000);
            $this->sendMessage($newArr,$title,$content,$extrasArr,$system,$isdebug,$alias,$tagArr);
            $cidArr = array_slice($cidArr,0,1000);
        }
        $response = $client->push()
            //设置发送的平台
            ->setPlatform($this->pushSystemArr[$system])
            ->addRegistrationId($cidArr);
        if ($alias){
            $response->addalias($alias);
        }
        if ($tagArr){
            $response->addTag($tagArr);
        }
        //->addalias($pushId)
        //->addTag(array('tag1', 'tag2'))
        $isdebug = $isdebug ? true : false;
        $response->message($content, array(
            'title' => $title,
            // 'content_type' => 'text',
            'extras' => $extrasArr,
        ))
            ->options(array(
                //设置推送环境True 表示推送生产环境，False 表示要推送开发环境；
                'apns_production' => $isdebug,
            ));
        try {
            //执行推送
            $response->send();
            $ret = ['status'=>1,'msg'=>'已推送'];

        } catch (\JPush\Exceptions\JPushException $e) {
            $ret = ['status'=>0,'msg'=>$e];
        }
        return $ret;
    }

}